-
-
Notifications
You must be signed in to change notification settings - Fork 442
Support Always Run As Administrator #3573
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: dev
Are you sure you want to change the base?
Conversation
…hen running admin mode when application is under admin mode
This comment has been minimized.
This comment has been minimized.
🥷 Code experts: onesounds Jack251970, onesounds have most 👩💻 activity in the files. See details
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame:
Activity based on git-commit:
Knowledge based on git-blame: To learn more about /:\ gitStream - Visit our Docs |
Be a legend 🏆 by adding a before and after screenshot of the changes you made, especially if they are around UI/UX. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR adds support for running Flow Launcher as administrator by updating startup configurations, user dialogs, and process launching logic. Key changes include:
- Adding a UAC dialog for confirming elevation and updating related UI elements.
- Modifying process launch methods to handle elevated and non-elevated launches based on user settings.
- Enhancing auto-startup and settings logic to support an "Always Run As Administrator" option.
Reviewed Changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 2 comments.
Show a summary per file
File | Description |
---|---|
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs | New UAC dialog implementation for admin confirmation. |
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml | UI layout for the UAC dialog. |
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | Updates to launch processes with optional elevation and minor task configuration. |
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | Adjustments to launch UWP packages with elevation support. |
Plugins/Flow.Launcher.Plugin.Program/Main.cs | Added IsAdmin flag to identify current process elevation state. |
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs | Updates to auto-startup handling and admin state checks in settings. |
Other files (Languages, AutoStartup, App.xaml.cs, PublicAPIInstance.cs, Win32Helper.cs, Settings.cs) | Various supporting changes to configuration, localization strings, and helper methods for administrator mode. |
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <[email protected]>
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. 📝 WalkthroughWalkthroughAdds an "AlwaysRunAsAdministrator" setting and UI, admin detection and token-based RunAsDesktopUser helper, new restart paths that can request elevation, PublicAPI StartProcess/RestartApp extensions, a helper command executable to launch processes, and related plugin updates and native interop for token/process APIs. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant User
participant App
participant Settings
participant Win32 as Win32Helper
participant Upd as Update.exe
User->>App: Start
App->>Settings: Read AlwaysRunAsAdministrator
alt AlwaysRunAsAdministrator == true
App->>Win32: IsAdministrator()
alt not elevated
App->>App: RestartApp(forceAdmin: true)
App->>Upd: Start Update.exe with runas --processStartAndWait Flow.Launcher.exe
App-->>User: Exit
else elevated
App-->>User: Continue startup
end
else
App-->>User: Continue startup
end
sequenceDiagram
autonumber
participant UI as Settings UI
participant VM as SettingsPaneGeneralViewModel
participant Auto as AutoStartup
participant Win32 as Win32Helper
participant Task as Task Scheduler
UI->>VM: Toggle AlwaysRunAsAdministrator
VM->>Auto: ChangeToViaLogonTask(alwaysRunAsAdministrator)
Auto->>Win32: IsAdministrator()
alt Admin user
Auto->>Task: Schedule task with RunLevel Highest if flag true
else Non-admin
Auto->>Task: Validate path & run level
alt run level mismatch
Auto-->>VM: Throw exception / request manual change
else path mismatch
Auto->>Task: Reschedule task
end
end
VM->>VM: If enabling and not elevated, prompt to restart as admin
sequenceDiagram
autonumber
participant Plugin
participant API as PublicAPIInstance
participant Win32 as Win32Helper
participant Cmd as Flow.Launcher.Command.exe
participant Proc as Target Process
Plugin->>API: StartProcess(file, args, useShellExecute, verb, createNoWindow)
alt Flow is elevated
API->>Win32: RunAsDesktopUser(app: Cmd, cmdLine: -StartProcess ...)
Win32->>Proc: CreateProcessWithTokenW (desktop user)
Win32-->>API: success/failure
else not elevated
API->>Proc: Process.Start(file, args, ...)
end
API-->>Plugin: bool success
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Possibly related PRs
Suggested reviewers
Pre-merge checks and finishing touches✅ Passed checks (5 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 8
🔭 Outside diff range comments (1)
Flow.Launcher/Helper/AutoStartup.cs (1)
173-200
: 🛠️ Refactor suggestionAdd error handling for administrator privilege settings.
The method doesn't explicitly check if setting the RunLevel was successful, which could lead to silent failures.
private static bool ScheduleLogonTask(bool alwaysRunAsAdministrator) { using var td = TaskService.Instance.NewTask(); td.RegistrationInfo.Description = LogonTaskDesc; td.Triggers.Add(new LogonTrigger { UserId = WindowsIdentity.GetCurrent().Name, Delay = TimeSpan.FromSeconds(2) }); td.Actions.Add(Constant.ExecutablePath); + bool requestedElevation = false; // Only if the app is running as administrator, we can set the run level to highest if (Win32Helper.IsAdministrator() && alwaysRunAsAdministrator) { td.Principal.RunLevel = TaskRunLevel.Highest; + requestedElevation = true; } td.Settings.StopIfGoingOnBatteries = false; td.Settings.DisallowStartIfOnBatteries = false; td.Settings.ExecutionTimeLimit = TimeSpan.Zero; try { - TaskService.Instance.RootFolder.RegisterTaskDefinition(LogonTaskName, td); + var registeredTask = TaskService.Instance.RootFolder.RegisterTaskDefinition(LogonTaskName, td); + + // Verify that elevation was set if requested + if (requestedElevation && registeredTask.Definition.Principal.RunLevel != TaskRunLevel.Highest) + { + App.API.LogWarning(ClassName, "Failed to set task to run with highest privileges"); + // We don't fail the operation, just log a warning + } + return true; } catch (Exception e) { App.API.LogError(ClassName, $"Failed to schedule logon task: {e}"); return false; } }
🧹 Nitpick comments (10)
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml (1)
56-66
: Consider adding a warning about security implications.Running applications with administrator privileges can have security implications. Consider adding a more detailed tooltip or warning about the potential risks of always running with elevated privileges.
Example enhancement:
<cc:Card Title="{DynamicResource alwaysRunAsAdministrator}" Icon="" - Sub="{DynamicResource alwaysRunAsAdministratorToolTip}"> + Sub="{DynamicResource alwaysRunAsAdministratorToolTip}" + Style="{StaticResource WarningCardStyle}"> <ui:ToggleSwitch IsOn="{Binding AlwaysRunAsAdministrator}" OffContent="{DynamicResource disable}" OnContent="{DynamicResource enable}" /> </cc:Card>Note: This assumes a WarningCardStyle exists or would need to be created.
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs (3)
12-13
: Consider adding XML documentation and using consistent naming conventions for static fields.Both
msgBox
and_result
are static fields, but they use inconsistent naming conventions. Consider prefixing both with underscore for consistency, or use a consistent naming style.- private static UACDialog msgBox; + private static UACDialog _msgBox; private static MessageBoxResult _result = MessageBoxResult.None;
68-78
: Clean up dialog instance consistently in button handlers.The Button_Click method sets the dialog instance to null, but the field is static and might be accessed from other threads. Consider applying the same pattern to the KeyEsc_OnPress method.
private void KeyEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { DialogResult = false; Close(); + _result = MessageBoxResult.None; + _msgBox = null; } private void Button_Click(object sender, RoutedEventArgs e) { if (sender == btnYes) _result = MessageBoxResult.Yes; else if (sender == btnNo) _result = MessageBoxResult.No; else _result = MessageBoxResult.None; - msgBox.Close(); - msgBox = null; + _msgBox.Close(); + _msgBox = null; }
80-85
: Use consistent naming in Button_Cancel method.The Button_Cancel method references
msgBox
directly, but should use the renamed field if you adopt the suggestion above.private void Button_Cancel(object sender, RoutedEventArgs e) { _result = MessageBoxResult.Cancel; - msgBox.Close(); - msgBox = null; + _msgBox.Close(); + _msgBox = null; }Flow.Launcher/Helper/AutoStartup.cs (1)
120-131
: Document startup method changes for administrator mode.The code includes a good comment explaining why registry startup doesn't support administrator mode, but could benefit from additional documentation.
public static void ChangeToViaLogonTask(bool alwaysRunAsAdministrator) { Disable(false); Enable(true, alwaysRunAsAdministrator); } public static void ChangeToViaRegistry() { Disable(true); + // Registry startup doesn't support running as administrator because it doesn't have an option + // to elevate privileges like the Task Scheduler does with RunLevel.Highest // We do not need to use alwaysRunAsAdministrator for registry, so we just set false here Enable(false, false); }Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs (5)
4-5
: Namespace collision risk between WPF and WinForms typesAdding
using System.Windows;
to a file that is already importingSystem.Windows.Forms
increases the likelihood of ambiguous type resolutions (MessageBox
,Screen
,DragEventArgs
, …).
Although you currently reference the enumerations by their full namespace (MessageBoxButton
,MessageBoxResult
) the next developer who tries to callMessageBox.Show
(or similar) will hit a compile-time ambiguity.Two low-effort mitigations:
-using System.Windows; +using Wpf = System.Windows;or import only the specific WPF types you need:
using System.Windows.MessageBoxButton; using System.Windows.MessageBoxResult;Either option keeps the intent clear and shields you from hidden compilation errors down the road.
26-27
: Static cache of elevation status can become stale after restart-in-place
_isAdministrator
is captured once when theSettingsPaneGeneralViewModel
type is first touched.
If (in a future enhancement) you decide to elevate the process without a full application restart, this flag will remain false, giving you inconsistent behaviour.Safer alternative: turn it into a computed property or refresh it inside
CheckAdminChangeAndAskForRestart()
right before the comparison.-private static readonly bool _isAdministrator = Win32Helper.IsAdministrator(); +private static bool IsAdministrator => Win32Helper.IsAdministrator();Then replace usages accordingly.
72-78
: Restart prompt executes even when startup-task creation fails
CheckAdminChangeAndAskForRestart()
is invoked regardless of whetherAutoStartup.ChangeToViaLogonTask
threw.
In the failure path we show the user two dialogs: one for the error and then another asking for a restart—yet we know the scheduled task is still out of sync.Consider short-circuiting when the startup change fails or basing the restart prompt on the success flag returned by the helper.
94-113
: Duplicate logic – consider extracting a helperThe
UseLogonTaskForStartup
setter repeats almost the same try/catch & restart-check block found inStartFlowLauncherOnSystemStartup
.
Extracting this into a private method (e.g.UpdateStartupMethod(bool viaLogonTask)
) would keep the two setters terse and DRY.
141-154
: Restart helper could lose original command-line context
App.API.RestartApp(AlwaysRunAsAdministrator ? "runas" : string.Empty);
forwards only the elevation flag.
If the user had started Flow Launcher with extra CLI arguments (portable mode, debug flags, etc.) they will be dropped during restart.Recommend overloading
RestartApp
to accept an argument builder or captureEnvironment.GetCommandLineArgs()
and re-use them when invoking the new process.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
Flow.Launcher.Infrastructure/UserSettings/Settings.cs
(1 hunks)Flow.Launcher.Infrastructure/Win32Helper.cs
(2 hunks)Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
(1 hunks)Flow.Launcher/App.xaml.cs
(1 hunks)Flow.Launcher/Helper/AutoStartup.cs
(7 hunks)Flow.Launcher/Languages/en.xaml
(2 hunks)Flow.Launcher/MainWindow.xaml.cs
(1 hunks)Flow.Launcher/PublicAPIInstance.cs
(2 hunks)Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
(1 hunks)Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
(6 hunks)Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
(1 hunks)Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
(1 hunks)Plugins/Flow.Launcher.Plugin.Program/Main.cs
(3 hunks)Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
(4 hunks)Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
(5 hunks)Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml
(1 hunks)Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs
(1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (2)
Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs (1)
Flow.Launcher/Helper/AutoStartup.cs (2)
AutoStartup
(12-230)ChangeToViaLogonTask
(120-124)
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs (2)
Flow.Launcher/PublicAPIInstance.cs (1)
RestartApp
(75-75)Flow.Launcher.Core/Plugin/JsonRPCV2Models/JsonRPCPublicAPI.cs (1)
RestartApp
(27-30)
🪛 GitHub Actions: Check Spelling
Flow.Launcher/App.xaml.cs
[warning] 63-63: WMP
is not a recognized word. (unrecognized-spelling)
[warning] 106-119: Ioc
is not a recognized word. (unrecognized-spelling)
[warning] 174-174: Ioc
is not a recognized word. (unrecognized-spelling)
[warning] 199-199: Loadertask
is not a recognized word. (unrecognized-spelling)
[warning] 225-225: VSTHRD
is not a recognized word. (unrecognized-spelling)
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
[warning] 216-216: spefic
is not a recognized word. (unrecognized-spelling)
[warning] 357-357: requerying
is not a recognized word. (unrecognized-spelling)
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs
[warning] 91-94: uap
and rescap
are not recognized words. (unrecognized-spelling)
[warning] 462-462: dlgtitle
is not a recognized word. (unrecognized-spelling)
[warning] 535-535: uap
is not a recognized word. (unrecognized-spelling)
Flow.Launcher/MainWindow.xaml.cs
[warning] 61-61: WMP
is not a recognized word. (unrecognized-spelling)
[warning] 100-100: VSTHRD
is not a recognized word. (unrecognized-spelling)
[warning] 460-475: VSTHRD
is not a recognized word. (unrecognized-spelling)
[warning] 564-566: WMP
is not a recognized word. (unrecognized-spelling)
[warning] 652-678: gamemode
and positionreset
are not recognized words. (unrecognized-spelling)
[warning] 794-795: XRatio
and YRatio
are not recognized words. (unrecognized-spelling)
[warning] 1009-1018: clocksb
and iconsb
are not recognized words. (unrecognized-spelling)
Plugins/Flow.Launcher.Plugin.Program/Main.cs
[warning] 20-20: Reloadable
is not a recognized word. (unrecognized-spelling)
[warning] 46-47: unins
and uninst
are not recognized words. (unrecognized-spelling)
[warning] 50-50: Uninstaller
is not a recognized word. (unrecognized-spelling)
[warning] 66-68: desinstalar
is not a recognized word. (unrecognized-spelling)
[warning] 78-79: Uninstaller
is not a recognized word. (unrecognized-spelling)
[warning] 135-137: Uninstallers
is not a recognized word. (unrecognized-spelling)
[warning] 142-145: uninst
, uninstaller
, and Uninstaller
are not recognized words. (unrecognized-spelling)
[warning] 145-157: Prefixs
and uninstaller
are not recognized words. (unrecognized-spelling)
[warning] 389-449: dlgtitle
is not a recognized word. (unrecognized-spelling)
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml
[warning] 2-2: UAC
is not a recognized word. (unrecognized-spelling)
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
[warning] 223-224: UAC
is not a recognized word. (unrecognized-spelling)
[warning] 231-231: workaround
is not a recognized word. (unrecognized-spelling)
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs
[warning] 2-2: UAC
is not a recognized word. (unrecognized-spelling)
Flow.Launcher.Infrastructure/Win32Helper.cs
[warning] 42-42: Dwm
is not a recognized word. (unrecognized-spelling)
[warning] 54-54: DWMSBT
and SYSTEMBACKDROP
are not recognized words. (unrecognized-spelling)
[warning] 55-55: DWMSBT
and SYSTEMBACKDROP
are not recognized words. (unrecognized-spelling)
[warning] 56-56: DWMSBT
and SYSTEMBACKDROP
are not recognized words. (unrecognized-spelling)
[warning] 59-59: Dwm
and PInvoke
are not recognized words. (unrecognized-spelling)
[warning] 61-61: DWMWA
, DWMWINDOWATTRIBUTE
, and SYSTEMBACKDROP
are not recognized words. (unrecognized-spelling)
[warning] 70-70: Dwm
and PInvoke
are not recognized words. (unrecognized-spelling)
[warning] 72-72: DWMWA
and DWMWINDOWATTRIBUTE
are not recognized words. (unrecognized-spelling)
[warning] 88-90: DWMWCP
is not a recognized word. (unrecognized-spelling)
[warning] 94-94: Dwm
and PInvoke
are not recognized words. (unrecognized-spelling)
[warning] 96-96: DWMWA
and DWMWINDOWATTRIBUTE
are not recognized words. (unrecognized-spelling)
[warning] 107-107: PInvoke
is not a recognized word. (unrecognized-spelling)
[warning] 162-189: GWL
is not a recognized word. (unrecognized-spelling)
[warning] 198-210: Wnd
is not a recognized word. (unrecognized-spelling)
[warning] 239-239: Wnd
is not a recognized word. (unrecognized-spelling)
[warning] 263-277: WINTAB
, Progman
, and WORKERW
are not recognized words. (unrecognized-spelling)
[warning] 517-523: hkl
is not a recognized word. (unrecognized-spelling)
[warning] 549-549: nqo
is not a recognized word. (unrecognized-spelling)
[warning] 622-646: tsf
and Tsf
are not recognized words. (unrecognized-spelling)
[warning] 682-685: Noto
is not a recognized word. (unrecognized-spelling)
[warning] 726-751: noto
is not a recognized word. (unrecognized-spelling)
⏰ Context from checks skipped due to timeout of 90000ms (5)
- GitHub Check: gitStream workflow automation
- GitHub Check: gitStream.cm
- GitHub Check: gitStream.cm
- GitHub Check: gitStream.cm
- GitHub Check: build
🔇 Additional comments (25)
Flow.Launcher.Infrastructure/Win32Helper.cs (2)
8-8
: New dependency added for administrator check.Good addition of the
System.Security.Principal
namespace, which is required for the newIsAdministrator()
method implementation.
758-767
: Well-implemented administrator check method.The
IsAdministrator()
method follows the standard pattern for detecting administrator privileges in Windows applications usingWindowsPrincipal
andWindowsBuiltInRole
. This centralized implementation will help maintain consistency when checking for elevated permissions throughout the application.Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)
375-375
: New setting for administrator mode.Good implementation of the
AlwaysRunAsAdministrator
property with a sensible default value offalse
. This ensures that the application doesn't unexpectedly run with elevated permissions unless explicitly configured by the user.Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs (1)
36-41
: New API method for restarting with arguments.The addition of
RestartApp(string arguments)
method to the public API will allow the application to restart with custom command-line arguments, which is essential for implementing the administrator mode toggle functionality.Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml (1)
100-102
: LGTM! User Account Control strings are well-structured.The new localization strings for the UAC dialog look good. They follow the standard Windows UAC prompt format with a title, confirmation question, and program location display.
Flow.Launcher/App.xaml.cs (1)
239-239
: LGTM! Successfully added administrator parameter to auto-startup check.The change properly passes the new
AlwaysRunAsAdministrator
setting to theCheckIsEnabled
method, ensuring that auto-startup respects the administrator mode preference.Flow.Launcher/MainWindow.xaml.cs (1)
598-605
: LGTM! Notify icon now shows administrator status correctly.Good implementation of conditional text for the notify icon tooltip. This provides clear visual feedback to users when the application is running with elevated privileges.
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml (1)
47-66
: LGTM! Well-structured UI for administrator mode settings.The new UI elements for administrator mode are well-organized. The CardGroup approach logically groups the related startup settings together, and the toggle for "Always Run as Administrator" is properly bound to the corresponding property in the view model.
I particularly like the choice of icons - the shield icon () is perfect for representing administrator privileges, making the purpose of the setting immediately clear to users.
Plugins/Flow.Launcher.Plugin.Program/Main.cs (3)
6-6
: Appropriate addition of required namespace.Adding the System.Security.Principal namespace is necessary for the WindowsIdentity and WindowsPrincipal classes used in the new IsAdministrator method.
36-36
: Good addition of an administrator status indicator.This static boolean field provides a centralized way to determine the current administrator status within the plugin, properly initialized using the IsAdministrator method.
466-471
: Well-implemented administrator check method.The IsAdministrator method follows the standard pattern for checking Windows administrator privileges:
- Gets the current Windows identity
- Creates a principal from this identity
- Checks if the principal is in the Administrator role
The implementation is clean and correctly disposes of the WindowsIdentity object with a using statement.
Flow.Launcher/Languages/en.xaml (2)
49-49
: Good addition of admin indicator label.This localized string will be used to indicate administrator mode in the UI, supporting the new feature.
135-138
: Complete set of localization strings for administrator mode.The added strings provide comprehensive text resources for the administrator mode functionality:
- Toggle label for the setting
- Tooltip explaining the functionality
- Dialog title for mode change
- Confirmation message for restart
These strings ensure the feature is properly localized and user-friendly.
Flow.Launcher/PublicAPIInstance.cs (3)
75-75
: Good addition of parameter-less overload for backward compatibility.Adding an overload that calls the parameterized version with null maintains compatibility with existing code while extending functionality.
78-78
: Enhancement of RestartApp to support command-line arguments.The method signature change allows passing arguments to the application when restarting, which is essential for the administrator mode feature.
93-93
: Properly passing arguments to the UpdateManager.The UpdateManager.RestartApp call is now correctly passing the arguments parameter, enabling restart with custom command-line options.
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs (3)
458-458
: Good refactoring to centralize launch logic.Replacing inline launch code with a call to the dedicated Launch method improves code maintainability and consistency.
502-502
: Consistent use of centralized launch method.Using the same Launch method from the context menu handler ensures consistent behavior between different launch scenarios.
514-527
: Well-implemented launch method with proper object initialization.The refactored Launch method:
- Uses object initializer syntax for ProcessStartInfo which is cleaner
- Properly sets UseShellExecute and Verb properties
- Correctly executes the process asynchronously with Task.Run
- Uses ConfigureAwait(false) to avoid context capturing
This implementation properly handles elevation requests through the "runas" verb when needed.
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs (2)
199-202
: Simplified code by using the new Launch method.The code now uses a centralized Launch method for starting processes, which improves code organization and reusability.
271-272
: Simplified "Run as administrator" context menu implementation.The code now uses the centralized Launch method with elevated=true parameter, improving code organization.
Flow.Launcher/Helper/AutoStartup.cs (2)
20-52
: Add administrator privilege support to startup checking.The changes correctly implement the ability to run Flow Launcher with administrator privileges at startup by adding an
alwaysRunAsAdministrator
parameter.
54-84
: Add administrator privilege support to logon task checking.The changes allow checking if the logon task is set to run with administrator privileges.
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs (1)
55-56
:✅ Verification successful
Verify all call-sites migrated to new
ChangeToViaLogonTask(bool)
signatureThe extra parameter has been provided here, but older call-sites elsewhere in the codebase will silently compile if they rely on overload resolution (e.g. optional parameters) or might now fail.
Please run a sweep to ensure no stale overloads remain:
🏁 Script executed:
rg -n "ChangeToViaLogonTask(" --type cs
Length of output: 134
Let’s re-run the search using a fixed-string match to avoid regex errors:
🏁 Script executed:
#!/bin/bash rg -n -F "ChangeToViaLogonTask(" --type csLength of output: 755
All
ChangeToViaLogonTask
calls now use the new bool parameter
Verified viarg -F "ChangeToViaLogonTask(" --type cs
—no parameterless calls remain.Call-sites updated:
- Resources/Pages/WelcomePage5.xaml.cs:48
- SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs:55, 94, 127
Definition in Helper/AutoStartup.cs only exposes
ChangeToViaLogonTask(bool)
, so no stale overloads exist.Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs (1)
48-48
: Code correctly implements administrator mode setting for startupThe change properly passes the
AlwaysRunAsAdministrator
setting to theChangeToViaLogonTask
method, ensuring that Flow Launcher will respect the user's preference for running with elevated privileges on system startup. This aligns with the PR objective of supporting plugins that require administrator mode.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR adds support for launching Flow Launcher as administrator by introducing a new AlwaysRunAsAdministrator setting and updating the process launching, auto-start, and UAC dialog functionalities accordingly. Key changes include:
- Adding a new AlwaysRunAsAdministrator property in settings and updating the settings UI.
- Modifying the logon task and process launch logic throughout the application to account for administrator mode.
- Enhancing the UAC dialog and related helper methods to support elevated launch flows.
Reviewed Changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 4 comments.
Show a summary per file
File | Description |
---|---|
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml.cs | Added a UAC dialog for confirming elevation with asynchronous image loading. |
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | Updated process launching logic to conditionally show the UAC dialog and to handle elevated launch. |
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | Modified UWP package launch flow to support administrator mode with updated auto-start handling. |
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | Integrated a new toggle for AlwaysRunAsAdministrator in the settings UI. |
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs | Updated logon task startup logic to include the administrator mode flag. |
Flow.Launcher/Helper/AutoStartup.cs | Adjusted logon task scheduling to incorporate the AlwaysRunAsAdministrator parameter. |
Flow.Launcher/PublicAPIInstance.cs | Provided an overload of RestartApp to accept command-line arguments for admin mode restart. |
Flow.Launcher/Infrastructure/Win32Helper.cs | Added a helper method to check administrator status. |
Flow.Launcher/Infrastructure/UserSettings/Settings.cs | Introduced the AlwaysRunAsAdministrator setting property. |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
Adds support for always running Flow Launcher as administrator by extending startup configuration, command execution, and UI.
- Introduces a UAC confirmation dialog for elevated launches when already running as admin.
- Updates Win32 and UWP launch paths to handle elevated/non-elevated scenarios, including “Always Run As Administrator” toggle.
- Extends settings UI and auto-startup helper to configure logon task run level and prompt for restart on admin-mode changes.
Reviewed Changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 3 comments.
Show a summary per file
File | Description |
---|---|
Plugins/Flow.Launcher.Plugin.Program/UACDialog.xaml(.cs) | New modal dialog for UAC confirmation when launching elevated |
Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs | Refactored launch logic, added elevated flag |
Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | Updated UWP launch with elevated support |
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml | Added toggle for “Always run as administrator” |
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs | Handles new setting, prompts restart |
Flow.Launcher/Helper/AutoStartup.cs | Propagates new flag to logon task configuration |
Flow.Launcher/PublicAPIInstance.cs | Added overload to RestartApp with arguments |
Flow.Launcher/MainWindow.xaml.cs | Displays “(Admin)” in tray icon text when elevated |
Flow.Launcher.Infrastructure/Win32Helper.cs | Exposes IsAdministrator helper |
Flow.Launcher.Infrastructure/UserSettings/Settings.cs | New AlwaysRunAsAdministrator setting |
Comments suppressed due to low confidence (2)
Flow.Launcher/MainWindow.xaml.cs:598
- [nitpick] Variable name 'text' is too generic; consider renaming to 'notifyIconText' or similar to clarify its purpose.
var text = Win32Helper.IsAdministrator() ?
Flow.Launcher/PublicAPIInstance.cs:93
- Verify that UpdateManager.RestartApp supports an overload with arguments; if not, this call will fail at runtime or cause a breaking change in the public API.
UpdateManager.RestartApp(Constant.ApplicationFileName, arguments);
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (6)
Flow.Launcher.Infrastructure/NativeMethods.txt (1)
96-108
: Eliminate the duplicate P/Invoke declarations.
GetShellWindow
,GetWindowThreadProcessId
, andOpenProcess
are already declared earlier in this manifest; redeclaring them here invites silent drift and signature skew. Please keep a single definition for each native API.Flow.Launcher/App.xaml.cs (1)
62-67
: Handle UAC cancellation to avoid locking users out.When
AlwaysRunAsAdministrator
is true, a non-elevated launch hitsRestartApp(true)
inside the constructor. If the user cancels the UAC prompt,Process.Start
throwsWin32Exception(1223)
and the app crashes; on relaunch the same guard triggers again, so the user can never get back in to toggle the setting off. Even if you catch the exception later, the unconditionalreturn;
keeps the constructor from completing, leaving the app uninitialized.Wrap the restart attempt in a
try/catch
that treatsERROR_CANCELLED
(1223) as “restart failed”, keep the constructor running in that case, and optionally clearAlwaysRunAsAdministrator
so the user regains control.Flow.Launcher/PublicAPIInstance.cs (1)
625-672
: Critical: Ignoring boolean return value fromRunAsDesktopUser
.The code calls
Win32Helper.RunAsDesktopUser
(line 634) but only checks iferrorInfo
is non-empty (line 647) to determine success. The boolean return value is ignored. If the method returnsfalse
but leaveserrorInfo
empty, the code will incorrectly returntrue
(line 652), creating false positives. This was previously flagged but not fixed.Apply this diff to check the boolean return value:
// Use command executer to run the process as desktop user if running as admin if (Win32Helper.IsAdministrator()) { var result = Win32Helper.RunAsDesktopUser( Constant.CommandExecutablePath, Environment.CurrentDirectory, $"-StartProcess " + $"-FileName {AddDoubleQuotes(fileName)} " + $"-WorkingDirectory {AddDoubleQuotes(workingDirectory)} " + $"-Arguments {AddDoubleQuotes(arguments)} " + $"-UseShellExecute {useShellExecute} " + $"-Verb {AddDoubleQuotes(verb)} " + $"-CreateNoWindow {createNoWindow}", false, true, // Do not show the command window out var errorInfo); - if (!string.IsNullOrEmpty(errorInfo)) + + if (!result) { LogError(ClassName, $"Failed to start process {fileName} with arguments {arguments} under {workingDirectory}: {errorInfo}"); + return false; } return result; }Flow.Launcher.Infrastructure/Win32Helper.cs (2)
1141-1163
:CreateProcessWithTokenW
requires a mutable command-line buffer.
CreateProcessWithTokenW
may modify the command-line string in place. Passing a pinned immutablestring
(line 1144) can cause undefined behavior or access violations. This was previously flagged but not addressed.Allocate a mutable char buffer instead:
+// Allocate mutable buffer for command line +char* cmdLineMutable = null; +var cmdLineStr = $"- {cmdLine}"; +if (!string.IsNullOrEmpty(cmdLineStr)) +{ + cmdLineMutable = (char*)Marshal.StringToHGlobalUni(cmdLineStr); +} + fixed (char* appPtr = app) -// Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line -// So we add one more dash before the command line to make command line work correctly -fixed (char* cmdLinePtr = $"- {cmdLine}") fixed (char* currentDirPtr = currentDir) { + try + { if (!PInvoke.CreateProcessWithToken( hPrimaryToken, // If you need to access content in HKEY_CURRENT_USER, please set loadProfile to true loadProfile ? CREATE_PROCESS_LOGON_FLAGS.LOGON_WITH_PROFILE : 0, appPtr, - cmdLinePtr, + cmdLineMutable, // If you do not want to create a window for console app, please set createNoWindow to true createNoWindow ? PROCESS_CREATION_FLAGS.CREATE_NO_WINDOW : 0, null, currentDirPtr, &si, &pi)) { errorInfo = $"CreateProcessWithTokenW failed: {Marshal.GetLastWin32Error()}"; goto cleanup; } + } + finally + { + if (cmdLineMutable != null) Marshal.FreeHGlobal((nint)cmdLineMutable); + } }
1048-1083
: Verify privilege adjustment succeeded.
AdjustTokenPrivileges
returns success even when no privilege is actually enabled. You must explicitly check iflastError == ERROR_NOT_ALL_ASSIGNED
to confirm the privilege was granted. This was previously flagged but not addressed.Apply this diff to add the explicit check:
PInvoke.AdjustTokenPrivileges(hProcessToken, false, &tp, 0, null, null); var lastError = Marshal.GetLastWin32Error(); hProcessToken.Dispose(); -if (lastError != 0) +if (lastError == (int)WIN32_ERROR.ERROR_NOT_ALL_ASSIGNED) +{ + errorInfo = $"Failed to enable SE_INCREASE_QUOTA privilege: privilege not granted"; + return false; +} + +if (lastError != 0) { errorInfo = $"AdjustTokenPrivileges failed: {lastError}"; return false; }Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs (1)
120-145
: Critical: MissingOnPropertyChanged()
breaks UI bindings.The
AlwaysRunAsAdministrator
property setter does not callOnPropertyChanged()
, so UI bindings will not update when this property is changed programmatically. This was previously flagged and you acknowledged it as "Good", but the fix is not implemented in the current code.Additionally,
CheckAdminChangeAndAskForRestart()
is only called when bothStartFlowLauncherOnSystemStartup
andUseLogonTaskForStartup
are true (line 129). A user who manually starts Flow Launcher and toggles this flag will not be prompted to restart, leaving them in the wrong elevation state.Apply this diff to add
OnPropertyChanged()
and ensure restart prompts work regardless of startup configuration:public bool AlwaysRunAsAdministrator { get => Settings.AlwaysRunAsAdministrator; set { if (AlwaysRunAsAdministrator == value) return; Settings.AlwaysRunAsAdministrator = value; if (StartFlowLauncherOnSystemStartup && UseLogonTaskForStartup) { try { AutoStartup.ChangeToViaLogonTask(value); } catch (Exception e) { App.API.ShowMsg(App.API.GetTranslation("setAutoStartFailed"), e.Message); } - - // If we have enabled logon task startup, we need to check if we need to restart the app - // even if we encounter an error while setting the startup method - CheckAdminChangeAndAskForRestart(); } + + // Always check if restart is needed when toggling admin mode + CheckAdminChangeAndAskForRestart(); + OnPropertyChanged(); } }
🧹 Nitpick comments (2)
Flow.Launcher.Infrastructure/Http/Http.cs (1)
229-230
: Past review concerns about exception logging remain unaddressed.Removing the unused exception variable is fine, but previous reviewers flagged that exceptions should be logged rather than silently swallowed. Silent failures make debugging HTTP issues difficult and hide important diagnostic information.
Consider adding exception logging as previously suggested:
- catch (System.Exception) + catch (System.Exception ex) { + Log.Exception(ClassName, $"Error occurred while fetching string from URL <{url}>", ex); return string.Empty; }Was there a specific reason for not adding logging when addressing the previous review comments?
Plugins/Flow.Launcher.Plugin.Shell/Main.cs (1)
331-340
: Consider passingcreateNoWindow
parameter for completeness.The call to
Context.API.StartProcess
doesn't passinfo.CreateNoWindow
. While the current code doesn't explicitly set this property (so it defaults tofalse
), passing it would make the implementation more complete and future-proof.Apply this diff:
private static Process StartProcess(ProcessStartInfo info) { Context.API.StartProcess( info.FileName, workingDirectory: info.WorkingDirectory, argumentList: info.ArgumentList, useShellExecute: info.UseShellExecute, - verb: info.Verb); + verb: info.Verb, + createNoWindow: info.CreateNoWindow); return null; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
Flow.Launcher.Core/Configuration/Portable.cs
(2 hunks)Flow.Launcher.Core/Updater.cs
(2 hunks)Flow.Launcher.Infrastructure/Http/Http.cs
(1 hunks)Flow.Launcher.Infrastructure/NativeMethods.txt
(1 hunks)Flow.Launcher.Infrastructure/Win32Helper.cs
(4 hunks)Flow.Launcher/App.xaml.cs
(4 hunks)Flow.Launcher/Flow.Launcher.csproj
(1 hunks)Flow.Launcher/Languages/en.xaml
(2 hunks)Flow.Launcher/MainWindow.xaml.cs
(1 hunks)Flow.Launcher/PublicAPIInstance.cs
(6 hunks)Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs
(1 hunks)Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs
(7 hunks)Plugins/Flow.Launcher.Plugin.Shell/Main.cs
(6 hunks)Plugins/Flow.Launcher.Plugin.Sys/Main.cs
(5 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- Plugins/Flow.Launcher.Plugin.Sys/Main.cs
- Flow.Launcher/Languages/en.xaml
- Flow.Launcher/Flow.Launcher.csproj
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: Jack251970
PR: Flow-Launcher/Flow.Launcher#3573
File: Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs:491-493
Timestamp: 2025-06-18T13:55:09.190Z
Learning: When opening Windows settings (like indexing options), de-elevation is not needed since these operations cannot bring security risks, even when Flow Launcher is running as administrator.
📚 Learning: 2025-09-06T05:32:51.575Z
Learnt from: Jack251970
PR: Flow-Launcher/Flow.Launcher#3573
File: Plugins/Flow.Launcher.Plugin.Shell/Main.cs:330-339
Timestamp: 2025-09-06T05:32:51.575Z
Learning: In Flow.Launcher Shell plugin's StartProcess method, the maintainer Jack251970 prefers not to propagate launch failures from Context.API.StartProcess or throw exceptions when the API call returns false. Silent failure handling is intentional for shell commands in this plugin.
Applied to files:
Plugins/Flow.Launcher.Plugin.Shell/Main.cs
📚 Learning: 2025-06-08T14:12:12.842Z
Learnt from: Jack251970
PR: Flow-Launcher/Flow.Launcher#3672
File: Flow.Launcher/MainWindow.xaml.cs:318-318
Timestamp: 2025-06-08T14:12:12.842Z
Learning: In Flow.Launcher, the App.NotifyIcon static property is initialized in the App class before MainWindow creation, so null checks are not needed when accessing App.NotifyIcon in MainWindow lifecycle methods.
Applied to files:
Flow.Launcher/MainWindow.xaml.cs
📚 Learning: 2025-06-08T14:12:21.348Z
Learnt from: Jack251970
PR: Flow-Launcher/Flow.Launcher#3672
File: Flow.Launcher/MainWindow.xaml.cs:244-247
Timestamp: 2025-06-08T14:12:21.348Z
Learning: In Flow.Launcher, App.NotifyIcon is created before MainWindow creation, so null checks for App.NotifyIcon are not necessary when accessing it from MainWindow code.
Applied to files:
Flow.Launcher/MainWindow.xaml.cs
📚 Learning: 2025-06-18T13:55:09.190Z
Learnt from: Jack251970
PR: Flow-Launcher/Flow.Launcher#3573
File: Plugins/Flow.Launcher.Plugin.Explorer/ViewModels/SettingsViewModel.cs:491-493
Timestamp: 2025-06-18T13:55:09.190Z
Learning: When opening Windows settings (like indexing options), de-elevation is not needed since these operations cannot bring security risks, even when Flow Launcher is running as administrator.
Applied to files:
Flow.Launcher.Infrastructure/Win32Helper.cs
🧬 Code graph analysis (8)
Flow.Launcher.Infrastructure/Http/Http.cs (2)
Flow.Launcher.Infrastructure/DialogJump/DialogJump.cs (1)
System
(473-623)Flow.Launcher.Infrastructure/Logger/Log.cs (1)
Exception
(93-103)
Flow.Launcher.Core/Updater.cs (1)
Flow.Launcher/App.xaml.cs (1)
RestartApp
(425-460)
Plugins/Flow.Launcher.Plugin.Shell/Main.cs (2)
Flow.Launcher/PublicAPIInstance.cs (2)
StartProcess
(625-672)StartProcess
(674-675)Plugins/Flow.Launcher.Plugin.Program/Main.cs (1)
StartProcess
(464-477)
Flow.Launcher/MainWindow.xaml.cs (4)
Flow.Launcher.Infrastructure/Win32Helper.cs (2)
Win32Helper
(34-1180)IsAdministrator
(1025-1030)Flow.Launcher.Infrastructure/Constant.cs (1)
Constant
(7-60)Flow.Launcher/PublicAPIInstance.cs (1)
GetTranslation
(254-254)Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs (1)
GetTranslation
(180-180)
Flow.Launcher/Resources/Pages/WelcomePage5.xaml.cs (1)
Flow.Launcher/Helper/AutoStartup.cs (2)
AutoStartup
(12-263)ChangeToViaLogonTask
(151-156)
Flow.Launcher/PublicAPIInstance.cs (6)
Flow.Launcher/App.xaml.cs (3)
RestartApp
(425-460)App
(34-527)App
(60-131)Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs (4)
RestartApp
(35-35)RestartAppAsAdmin
(40-40)StartProcess
(651-651)StartProcess
(666-666)Plugins/Flow.Launcher.Plugin.Program/Main.cs (1)
StartProcess
(464-477)Flow.Launcher.Infrastructure/Win32Helper.cs (3)
Win32Helper
(34-1180)IsAdministrator
(1025-1030)RunAsDesktopUser
(1036-1177)Flow.Launcher.Infrastructure/Constant.cs (1)
Constant
(7-60)Plugins/Flow.Launcher.Plugin.Shell/Main.cs (2)
ProcessStartInfo
(191-329)Process
(331-340)
Flow.Launcher/App.xaml.cs (4)
Flow.Launcher/PublicAPIInstance.cs (4)
System
(82-96)System
(164-227)RestartApp
(78-78)MessageBoxResult
(523-526)Flow.Launcher.Infrastructure/Win32Helper.cs (2)
Win32Helper
(34-1180)IsAdministrator
(1025-1030)Flow.Launcher/Helper/AutoStartup.cs (2)
AutoStartup
(12-263)CheckIsEnabled
(20-52)Flow.Launcher.Infrastructure/Constant.cs (1)
Constant
(7-60)
Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs (4)
Flow.Launcher/PublicAPIInstance.cs (7)
System
(82-96)System
(164-227)ShowMsg
(133-134)ShowMsg
(136-139)GetTranslation
(254-254)MessageBoxResult
(523-526)RestartAppAsAdmin
(80-80)Flow.Launcher.Infrastructure/UserSettings/Settings.cs (1)
Settings
(15-617)Flow.Launcher/Helper/AutoStartup.cs (2)
AutoStartup
(12-263)ChangeToViaLogonTask
(151-156)Flow.Launcher.Infrastructure/Win32Helper.cs (2)
Win32Helper
(34-1180)IsAdministrator
(1025-1030)
🪛 GitHub Actions: Check Spelling
Flow.Launcher/MainWindow.xaml.cs
[error] 866-866: Forbidden pattern: 'work around' matches a line_forbidden.patterns entry: \bwork[- ]arounds?\b.
Flow.Launcher.Infrastructure/Win32Helper.cs
[warning] 1-1: Unrecognized spelling: 'PInvoke'.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: gitStream.cm
- GitHub Check: build
🔇 Additional comments (2)
Plugins/Flow.Launcher.Plugin.Shell/Main.cs (2)
21-21
: LGTM: Static Context enables access from helper methods.Changing
Context
to static is a reasonable design choice that enables access from the new staticStartProcess
method, which is necessary for the elevation-aware process launching introduced in this PR.
331-340
: Delegation to API correctly implements elevation-aware process launching.The new implementation correctly delegates to
Context.API.StartProcess
, which handles the elevation/de-elevation logic introduced in this PR. When Flow runs as administrator, the API uses the command helper executable to de-elevate child processes, preventing unintentional privilege escalation for shell commands. This aligns with the PR objectives.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
♻️ Duplicate comments (1)
Flow.Launcher.sln (1)
292-303
: Restore x64/x86 mappings for Flow.Launcher.Command
The new helper exe still maps every x64/x86 configuration back to Any CPU, so you never produce true platform-specific builds—same problem noted earlier. Please wire the mappings to their matching platforms (or drop the extra configurations entirely if the project is genuinely Any CPU).- {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x64.ActiveCfg = Debug|Any CPU - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x64.Build.0 = Debug|Any CPU + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x64.ActiveCfg = Debug|x64 + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x64.Build.0 = Debug|x64 - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x86.ActiveCfg = Debug|Any CPU - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x86.Build.0 = Debug|Any CPU + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x86.ActiveCfg = Debug|x86 + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Debug|x86.Build.0 = Debug|x86 - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x64.ActiveCfg = Release|Any CPU - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x64.Build.0 = Release|Any CPU + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x64.ActiveCfg = Release|x64 + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x64.Build.0 = Release|x64 - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x86.ActiveCfg = Release|Any CPU - {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x86.Build.0 = Release|Any CPU + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x86.ActiveCfg = Release|x86 + {A9976C5C-B73A-4D29-B654-EF1C0C4C9C8C}.Release|x86.Build.0 = Release|x86
🧹 Nitpick comments (1)
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml (1)
54-64
: Consider adding explicit margin for UI consistency.The implementation correctly follows the existing patterns for SettingsCard structure, bindings, and localization. The placement after startup settings is logical.
However, most other SettingsCards in this file have explicit
Margin
attributes (e.g.,Margin="0 4 0 0"
for related items). Consider adding a margin to maintain consistent spacing:- <ui:SettingsCard Description="{DynamicResource alwaysRunAsAdministratorToolTip}" Header="{DynamicResource alwaysRunAsAdministrator}"> + <ui:SettingsCard Margin="0 4 0 0" Description="{DynamicResource alwaysRunAsAdministratorToolTip}" Header="{DynamicResource alwaysRunAsAdministrator}">
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
Flow.Launcher.sln
(4 hunks)Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2024-10-08T15:52:58.573Z
Learnt from: taooceros
PR: Flow-Launcher/Flow.Launcher#2616
File: Flow.Launcher/Flow.Launcher.csproj:7-7
Timestamp: 2024-10-08T15:52:58.573Z
Learning: In the Flow Launcher project, the version number in the `Flow.Launcher.csproj` file is dynamically updated during the CI/CD process.
Applied to files:
Flow.Launcher.sln
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
- GitHub Check: Report (PR)
- GitHub Check: build
🔇 Additional comments (1)
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml (1)
60-62
: Verified AlwaysRunAsAdministrator binding and localization resources exist. SettingsPaneGeneralViewModel defines theAlwaysRunAsAdministrator
property, and bothalwaysRunAsAdministrator
andalwaysRunAsAdministratorToolTip
keys are present in the localization files.
This comment has been minimized.
This comment has been minimized.
@check-spelling-bot Report🔴 Please reviewSee the 📂 files view, the 📜action log, or 📝 job summary for details.
See ❌ Event descriptions for more information. Forbidden patterns 🙅 (1)In order to address this, you could change the content to not match the forbidden patterns (comments before forbidden patterns may help explain why they're forbidden), add patterns for acceptable instances, or adjust the forbidden patterns themselves. These forbidden patterns matched content: s.b. workaround(s)
If the flagged items are 🤯 false positivesIf items relate to a ...
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (1)
Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml (1)
68-80
: LGTM! Well-structured SettingsCard for admin mode.The new SettingsCard follows the established patterns in the file with proper icon, localization bindings, and ToggleSwitch structure. The XAML syntax is correct and consistent with other settings cards.
Optional: Consider placement relative to startup settings.
The linked issue #2639 requested the option be placed "near" the startup setting. Currently, the admin card is positioned after "hideOnStartup" (lines 54-66), which places it several cards away from the "StartFlowLauncherOnSystemStartup" expander (lines 35-52). You might consider:
- Placing it as a sub-item within the StartFlowLauncherOnSystemStartup expander (lines 44-51), or
- Positioning it immediately after the expander (after line 52) with appropriate margin
However, the current placement may be intentional to group visibility/behavior settings together, so this is purely a UX consideration rather than a functional issue.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
(3 hunks)Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml
(2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- Flow.Launcher.Plugin/Interfaces/IPublicAPI.cs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: build
Support Always Run As Administrator
Since some plugins may need administrator mode for handling sth, users may need to always run Flow Launcher as administrator.
We can edit
RunLevel
configuration for logon task and then Flow Launcher can be launched as admin mode during system startup.If it is enabled, Flow will check if it is run as admin during every startup.
One more thing
We need to manually config
Program
plugin &Shell
plugin so that it can handle running application as non-admin/admin correctly.Additionally, many other codes related to
Process.Start
are checked.Resolve #2639
Test